Introduction


Our primary dataset includes electoral data, education demographics, ethnic distributions, economics, labor statistics, public health figures and crime rates for the states (excluding Alaska, including District of Columbia) of the United States. The electoral data was collected by The New York Times and the remaining columns were aggregated by The Ulster Institute for Social Research for a publication in the Open Quantitative Sociology & Political Science journal in 2016. Our analysis included the joining of the ACS 2015 Census Data for Economics, Poverty and Race.

To download the cleaned version of this data set, visit “S17 DV Final Project” published by vcjaladi on data.world. It is a private dataset, so you may request access by emailing vcjaladi@utexas.edu

R Configuration

Below we display our sessionInfo().

sessionInfo(package=NULL)
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.4

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] backports_1.0.5 magrittr_1.5    rsconnect_0.7   rprojroot_1.2  
 [5] htmltools_0.3.5 tools_3.3.2     base64enc_0.1-3 yaml_2.1.14    
 [9] Rcpp_0.12.10    stringi_1.1.2   rmarkdown_1.3   knitr_1.15.1   
[13] jsonlite_1.3    stringr_1.1.0   digest_0.6.11   evaluate_0.10  
Warning messages:
1: In readLines("../01 Data/DataImport.R") :
  incomplete final line found on '../01 Data/DataImport.R'
2: In readLines("../01 Data/DataImport.R") :
  incomplete final line found on '../01 Data/DataImport.R'

The Data

Here is our data import code. To view a preview of the data, visit the data.world dataset mentioned in the introduction, or view the data summary on the first page of our shiny app, linked below.

require(data.world)

elections = query(
  data.world(),
  dataset="vcjaladi/s-17-dv-final-project", type="sql",
  query=
    "SELECT *
    FROM finalproject_ElectionsData
    LIMIT 5")

View(elections)

ETL Script

require(readr)
require(plyr)

# Set the Working Directory to the 00 Doc folder
file_path = "../01\ Data/finalproject_ElectionsData.csv"
elections <- readr::read_csv(file_path)
names(elections)

# keep if rename columns df plyr::rename(hydropower, c("Resource Assessment Site ID"="Site ID"))
df <- data.frame(elections)
names(elections)

dimensions <- c("State")

measures <- setdiff(names(df), dimensions)
measures

# Get rid of special characters in each column.
# Google ASCII Table to understand the following:
for(n in names(df)) {
  df[n] <- data.frame(lapply(df[n], gsub, pattern="[^ -~]",replacement= ""))
}

if( length(dimensions) > 0) {
  for(d in dimensions) {
    # Get rid of " and ' in dimensions.
    df[d] <- data.frame(lapply(df[d], gsub, pattern="[\"']",replacement= ""))
    # Change & to and in dimensions.
    df[d] <- data.frame(lapply(df[d], gsub, pattern="&",replacement= " and "))
    # Change : to ; in dimensions.
    df[d] <- data.frame(lapply(df[d], gsub, pattern=":",replacement= ";"))
  }
}

# Get rid of all characters in measures except for numbers, the - sign, and period.dimensions, and change NA to 0.
if( length(measures) > 1) {
  for(m in measures) {
    df[m] <- data.frame(lapply(df[m], gsub, pattern="[^--.0-9]",replacement= ""))
    df[m] <- data.frame(lapply(df[m], function(x) as.numeric(as.character(x)))) # This is needed to turn measures back to numeric because gsub turns them into strings.
  }
}
str(df)

write.csv(df, gsub("Elections_clean", "", file_path), row.names=FALSE, na = "")

Tableau Visualizations

We utilized a web connector to import our data into Tableau from data.world. We queried census data on data.world and downloaded the results as CSVs to make the import more efficient, and then joined all our tables within Tableau, as shown below.





This barchart shows a breakdown of the electoral swing states (created using a set), panelled by the victory margin they fall under. The bar represents the median income in that particular swing state. Each panel includes a reference line showing the average income for the particular victory margin. This visualization shows Hillary only won one swing state, New Hampshire, which has a higher median income than the other swing states. There isn’t a panel for a Hillary Landslide victory, further showing that she performed poorly in swing states.



The above map shows the bachelor degree attainment in each state, paged by region, and labeled by victory margin. The screenshots show examples of two of the pages, though there are four total regions, which can be viewed in the Tableau workbook. An interesting correlation shown in this map is that regions with predominately Trump victories also generally have lower bachelor’s degree attainment.



This scatterplot graphs the percentage of the population that voted democrat vs. the percentage of the population that is uninsured in each state. The points are colored and sized by a ratio of people in poverty in the given state. The trend line shows a suprising relationship - states with HIGHER uninsured rates voted democratic at LOWER rates. This again supports the idea that Hillary mainly appealed to rich voters, who were likely insured.



This dashboard puts together expanded versions of the previous 3 graphs. The bargraph is now for all states rather than just swing states. The map now shows all states rather than being paged by region. There is an action implented so that you may highlight a specific state or group of states on the barchart or map, and drill down on those states within the dashboard view. This action can be viewed within the Tableau workbook.



This histogram shows the count of states with particular percentages of people with an education level below highschool. It is colored by voter turnout. It appears as though states with higher percentages of people without high school diplomas experienced far worse voter turnout.



The above boxplots show the relationship between unemployment and victory margin, split up by region. It appears that there’s no strong relationship between unemployment and victory margin, and it may not have been a key point of contention in voters’ minds during this election.



This crosstab shows median incomes in regions for each victory margin category. It is colored by median income. Again, this visualization supports the idea that Hillary won in states with more wealthy individuals, as her portion of the crosstab are much darker.


The Shiny Application


Click here to visit the shiny application.




The above screenshot shows the Shiny application, which mirrors but does not exactly replicate our Tableau Visualizations.
The scatterplot page implements the brush feature, allowing the user to drill down and learn more about specific points of interest on the graph, expanding them into a seperate bar graph.
The sliders allow the user to change the margin of victory necessary for either candidate to have a “landslide” victory. Move the sliders and use the generate crosstabs button to refresh the plots.

LS0tCnRpdGxlOiAiRWxlY3Rpb25zIERhdGEgVmlzdWFsaXphdGlvbiIKYXV0aG9yOiAiSnVzdGluIE1ldW5pZXIsIFZhcnVuIEphbGFkaSwgRHlsYW4gUmFzY2gsIFNlYW4gTyduZWlsIgpkYXRlOiAiTWF5IDJuZCwgMjAxNyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKIyoqSW50cm9kdWN0aW9uKioKIVtdKGludHJvaW1nLmpwZyk8L2NlbnRlcj4KCjxicj4KT3VyIHByaW1hcnkgZGF0YXNldCBpbmNsdWRlcyBlbGVjdG9yYWwgZGF0YSwgZWR1Y2F0aW9uIGRlbW9ncmFwaGljcywgZXRobmljIGRpc3RyaWJ1dGlvbnMsIGVjb25vbWljcywgbGFib3Igc3RhdGlzdGljcywgcHVibGljIGhlYWx0aCBmaWd1cmVzIGFuZCBjcmltZSByYXRlcyBmb3IgdGhlIHN0YXRlcyAoZXhjbHVkaW5nIEFsYXNrYSwgaW5jbHVkaW5nIERpc3RyaWN0IG9mIENvbHVtYmlhKSBvZiB0aGUgVW5pdGVkIFN0YXRlcy4gVGhlIGVsZWN0b3JhbCBkYXRhIHdhcyBjb2xsZWN0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5ueXRpbWVzLmNvbS9lbGVjdGlvbnMvcmVzdWx0cy9wcmVzaWRlbnQiPlRoZSBOZXcgWW9yayBUaW1lczwvYT4gYW5kIHRoZSByZW1haW5pbmcgY29sdW1ucyB3ZXJlIGFnZ3JlZ2F0ZWQgYnkgVGhlIFVsc3RlciBJbnN0aXR1dGUgZm9yIFNvY2lhbCBSZXNlYXJjaCBmb3IgYSA8YSBocmVmPSIiPnB1YmxpY2F0aW9uPC9hPiBpbiB0aGUgPGk+IE9wZW4gUXVhbnRpdGF0aXZlIFNvY2lvbG9neSAmIFBvbGl0aWNhbCBTY2llbmNlPC9pPiBqb3VybmFsIGluIDIwMTYuIE91ciBhbmFseXNpcyBpbmNsdWRlZCB0aGUgam9pbmluZyBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kYXRhLndvcmxkL3VzY2Vuc3VzYnVyZWF1Ij5BQ1MgMjAxNSBDZW5zdXMgRGF0YTwvYT4gZm9yIEVjb25vbWljcywgUG92ZXJ0eSBhbmQgUmFjZS4KClRvIGRvd25sb2FkIHRoZSBjbGVhbmVkIHZlcnNpb24gb2YgdGhpcyBkYXRhIHNldCwgdmlzaXQgPGEgaHJlZj0iaHR0cHM6Ly9kYXRhLndvcmxkL3ZjamFsYWRpL3MtMTctZHYtZmluYWwtcHJvamVjdCI+IlMxNyBEViBGaW5hbCBQcm9qZWN0IjwvYT4gcHVibGlzaGVkIGJ5IHZjamFsYWRpIG9uIGRhdGEud29ybGQuIEl0IGlzIGEgcHJpdmF0ZSBkYXRhc2V0LCBzbyB5b3UgbWF5IHJlcXVlc3QgYWNjZXNzIGJ5IGVtYWlsaW5nIHZjamFsYWRpXEB1dGV4YXMuZWR1CgojKipSIENvbmZpZ3VyYXRpb24qKgpCZWxvdyB3ZSBkaXNwbGF5IG91ciBzZXNzaW9uSW5mbygpLgoKYGBge3Igc2Vzc2lvbkluZm99CnNlc3Npb25JbmZvKHBhY2thZ2U9TlVMTCkKYGBgCgojKipUaGUgRGF0YSoqCkhlcmUgaXMgb3VyIGRhdGEgaW1wb3J0IGNvZGUuIFRvIHZpZXcgYSBwcmV2aWV3IG9mIHRoZSBkYXRhLCB2aXNpdCB0aGUgZGF0YS53b3JsZCBkYXRhc2V0IG1lbnRpb25lZCBpbiB0aGUgaW50cm9kdWN0aW9uLCBvciB2aWV3IHRoZSBkYXRhIHN1bW1hcnkgb24gdGhlIGZpcnN0IHBhZ2Ugb2Ygb3VyIHNoaW55IGFwcCwgbGlua2VkIGJlbG93LgpgYGB7ciwgY29kZSA9IHJlYWRMaW5lcygnLi4vMDEgRGF0YS9EYXRhSW1wb3J0LlInKSwgZXZhbD1GQUxTRX0KYGBgCiMqKkVUTCBTY3JpcHQqKgpgYGB7ciwgY29kZSA9IHJlYWRMaW5lcygiLi4vMDEgRGF0YS9FbGVjdGlvbnNFVEwuUiIpLCBldmFsPUZBTFNFfQpgYGAKCiMqKlRhYmxlYXUgVmlzdWFsaXphdGlvbnMqKgpXZSB1dGlsaXplZCBhIHdlYiBjb25uZWN0b3IgdG8gaW1wb3J0IG91ciBkYXRhIGludG8gVGFibGVhdSBmcm9tIGRhdGEud29ybGQuIFdlIHF1ZXJpZWQgY2Vuc3VzIGRhdGEgb24gZGF0YS53b3JsZCBhbmQgZG93bmxvYWRlZCB0aGUgcmVzdWx0cyBhcyBDU1ZzIHRvIG1ha2UgdGhlIGltcG9ydCBtb3JlIGVmZmljaWVudCwgYW5kIHRoZW4gam9pbmVkIGFsbCBvdXIgdGFibGVzIHdpdGhpbiBUYWJsZWF1LCBhcyBzaG93biBiZWxvdy4KIVtdKFRhYmxlYXVKb2lucy5wbmcpPC9jZW50ZXI+Cjxicj48YnI+PGJyPgoKIVtdKFBpY3MvQmFyY2hhcnQucG5nKTwvY2VudGVyPgo8YnI+ClRoaXMgYmFyY2hhcnQgc2hvd3MgYSBicmVha2Rvd24gb2YgdGhlIGVsZWN0b3JhbCBzd2luZyBzdGF0ZXMgKGNyZWF0ZWQgdXNpbmcgYSBzZXQpLCBwYW5lbGxlZCBieSB0aGUgdmljdG9yeSBtYXJnaW4gdGhleSBmYWxsIHVuZGVyLiBUaGUgYmFyIHJlcHJlc2VudHMgdGhlIG1lZGlhbiBpbmNvbWUgaW4gdGhhdCBwYXJ0aWN1bGFyIHN3aW5nIHN0YXRlLiBFYWNoIHBhbmVsIGluY2x1ZGVzIGEgcmVmZXJlbmNlIGxpbmUgc2hvd2luZyB0aGUgYXZlcmFnZSBpbmNvbWUgZm9yIHRoZSBwYXJ0aWN1bGFyIHZpY3RvcnkgbWFyZ2luLiBUaGlzIHZpc3VhbGl6YXRpb24gc2hvd3MgSGlsbGFyeSBvbmx5IHdvbiBvbmUgc3dpbmcgc3RhdGUsIE5ldyBIYW1wc2hpcmUsIHdoaWNoIGhhcyBhIGhpZ2hlciBtZWRpYW4gaW5jb21lIHRoYW4gdGhlIG90aGVyIHN3aW5nIHN0YXRlcy4gVGhlcmUgaXNuJ3QgYSBwYW5lbCBmb3IgYSBIaWxsYXJ5IExhbmRzbGlkZSB2aWN0b3J5LCBmdXJ0aGVyIHNob3dpbmcgdGhhdCBzaGUgcGVyZm9ybWVkIHBvb3JseSBpbiBzd2luZyBzdGF0ZXMuCjxicj48YnI+PGJyPgoKIVtdKFBpY3MvTWFwLnBuZyk8L2NlbnRlcj4KIVtdKFBpY3MvTWFwRXgyLnBuZyk8L2NlbnRlcj4KPGJyPgpUaGUgYWJvdmUgbWFwIHNob3dzIHRoZSBiYWNoZWxvciBkZWdyZWUgYXR0YWlubWVudCBpbiBlYWNoIHN0YXRlLCBwYWdlZCBieSByZWdpb24sIGFuZCBsYWJlbGVkIGJ5IHZpY3RvcnkgbWFyZ2luLiBUaGUgc2NyZWVuc2hvdHMgc2hvdyBleGFtcGxlcyBvZiB0d28gb2YgdGhlIHBhZ2VzLCB0aG91Z2ggdGhlcmUgYXJlIGZvdXIgdG90YWwgcmVnaW9ucywgd2hpY2ggY2FuIGJlIHZpZXdlZCBpbiB0aGUgVGFibGVhdSB3b3JrYm9vay4gQW4gaW50ZXJlc3RpbmcgY29ycmVsYXRpb24gc2hvd24gaW4gdGhpcyBtYXAgaXMgdGhhdCByZWdpb25zIHdpdGggcHJlZG9taW5hdGVseSBUcnVtcCB2aWN0b3JpZXMgYWxzbyBnZW5lcmFsbHkgaGF2ZSBsb3dlciBiYWNoZWxvcidzIGRlZ3JlZSBhdHRhaW5tZW50Lgo8YnI+PGJyPjxicj4KCiFbXShQaWNzL1NjYXR0ZXJwbG90LnBuZyk8L2NlbnRlcj4KPGJyPgpUaGlzIHNjYXR0ZXJwbG90IGdyYXBocyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IHZvdGVkIGRlbW9jcmF0IHZzLiB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGlzIHVuaW5zdXJlZCBpbiBlYWNoIHN0YXRlLiBUaGUgcG9pbnRzIGFyZSBjb2xvcmVkIGFuZCBzaXplZCBieSBhIHJhdGlvIG9mIHBlb3BsZSBpbiBwb3ZlcnR5IGluIHRoZSBnaXZlbiBzdGF0ZS4gVGhlIHRyZW5kIGxpbmUgc2hvd3MgYSBzdXByaXNpbmcgcmVsYXRpb25zaGlwIC0gc3RhdGVzIHdpdGggSElHSEVSIHVuaW5zdXJlZCByYXRlcyB2b3RlZCBkZW1vY3JhdGljIGF0IExPV0VSIHJhdGVzLiBUaGlzIGFnYWluIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgSGlsbGFyeSBtYWlubHkgYXBwZWFsZWQgdG8gcmljaCB2b3RlcnMsIHdobyB3ZXJlIGxpa2VseSBpbnN1cmVkLiAKPGJyPjxicj48YnI+CgohW10oUGljcy9EYXNoYm9hcmQucG5nKTwvY2VudGVyPgo8YnI+ClRoaXMgZGFzaGJvYXJkIHB1dHMgdG9nZXRoZXIgZXhwYW5kZWQgdmVyc2lvbnMgb2YgdGhlIHByZXZpb3VzIDMgZ3JhcGhzLiBUaGUgYmFyZ3JhcGggaXMgbm93IGZvciBhbGwgc3RhdGVzIHJhdGhlciB0aGFuIGp1c3Qgc3dpbmcgc3RhdGVzLiBUaGUgbWFwIG5vdyBzaG93cyBhbGwgc3RhdGVzIHJhdGhlciB0aGFuIGJlaW5nIHBhZ2VkIGJ5IHJlZ2lvbi4gClRoZXJlIGlzIGFuIGFjdGlvbiBpbXBsZW50ZWQgc28gdGhhdCB5b3UgbWF5IGhpZ2hsaWdodCBhIHNwZWNpZmljIHN0YXRlIG9yIGdyb3VwIG9mIHN0YXRlcyBvbiB0aGUgYmFyY2hhcnQgb3IgbWFwLCBhbmQgZHJpbGwgZG93biBvbiB0aG9zZSBzdGF0ZXMgd2l0aGluIHRoZSBkYXNoYm9hcmQgdmlldy4gVGhpcyBhY3Rpb24gY2FuIGJlIHZpZXdlZCB3aXRoaW4gdGhlIFRhYmxlYXUgd29ya2Jvb2suCjxicj48YnI+PGJyPgoKIVtdKFBpY3MvSGlzdG9ncmFtLnBuZyk8L2NlbnRlcj4KPGJyPgpUaGlzIGhpc3RvZ3JhbSBzaG93cyB0aGUgY291bnQgb2Ygc3RhdGVzIHdpdGggcGFydGljdWxhciBwZXJjZW50YWdlcyBvZiBwZW9wbGUgd2l0aCBhbiBlZHVjYXRpb24gbGV2ZWwgYmVsb3cgaGlnaHNjaG9vbC4gSXQgaXMgY29sb3JlZCBieSB2b3RlciB0dXJub3V0LiBJdCBhcHBlYXJzIGFzIHRob3VnaCBzdGF0ZXMgd2l0aCBoaWdoZXIgcGVyY2VudGFnZXMgb2YgcGVvcGxlIHdpdGhvdXQgaGlnaCBzY2hvb2wgZGlwbG9tYXMgZXhwZXJpZW5jZWQgZmFyIHdvcnNlIHZvdGVyIHR1cm5vdXQuCjxicj48YnI+PGJyPgoKIVtdKFBpY3MvQm94cGxvdC5wbmcpPC9jZW50ZXI+Cjxicj4KVGhlIGFib3ZlIGJveHBsb3RzIHNob3cgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHVuZW1wbG95bWVudCBhbmQgdmljdG9yeSBtYXJnaW4sIHNwbGl0IHVwIGJ5IHJlZ2lvbi4gSXQgYXBwZWFycyB0aGF0IHRoZXJlJ3Mgbm8gc3Ryb25nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHVuZW1wbG95bWVudCBhbmQgdmljdG9yeSBtYXJnaW4sIGFuZCBpdCBtYXkgbm90IGhhdmUgYmVlbiBhIGtleSBwb2ludCBvZiBjb250ZW50aW9uIGluIHZvdGVycycgbWluZHMgZHVyaW5nIHRoaXMgZWxlY3Rpb24uCjxicj48YnI+PGJyPgoKIVtdKFBpY3MvQ3Jvc3N0YWIucG5nKTwvY2VudGVyPgo8YnI+ClRoaXMgY3Jvc3N0YWIgc2hvd3MgbWVkaWFuIGluY29tZXMgaW4gcmVnaW9ucyBmb3IgZWFjaCB2aWN0b3J5IG1hcmdpbiBjYXRlZ29yeS4gSXQgaXMgY29sb3JlZCBieSBtZWRpYW4gaW5jb21lLiBBZ2FpbiwgdGhpcyB2aXN1YWxpemF0aW9uIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgSGlsbGFyeSB3b24gaW4gc3RhdGVzIHdpdGggbW9yZSB3ZWFsdGh5IGluZGl2aWR1YWxzLCBhcyBoZXIgcG9ydGlvbiBvZiB0aGUgY3Jvc3N0YWIgYXJlIG11Y2ggZGFya2VyLgo8YnI+PGJyPjxicj4KCiMqKlRoZSBTaGlueSBBcHBsaWNhdGlvbioqCjxicj4KPGEgaHJlZj0gaHR0cHM6Ly9qdXN0aW5tZXVuaWVyLnNoaW55YXBwcy5pby9lbGVjdGlvbnN2aXN1YWxpemF0aW9ucy8+IENsaWNrIGhlcmUgdG8gdmlzaXQgdGhlIHNoaW55IGFwcGxpY2F0aW9uLiA8L2E+Cjxicj48YnI+CiFbXShzaGlueXNjcmVlbnNob3QucG5nKTwvY2VudGVyPgo8YnI+PGJyPjxicj4KClRoZSBhYm92ZSBzY3JlZW5zaG90IHNob3dzIHRoZSBTaGlueSBhcHBsaWNhdGlvbiwgd2hpY2ggbWlycm9ycyBidXQgZG9lcyBub3QgZXhhY3RseSByZXBsaWNhdGUgb3VyIFRhYmxlYXUgVmlzdWFsaXphdGlvbnMuCjxicj4KVGhlIHNjYXR0ZXJwbG90IHBhZ2UgaW1wbGVtZW50cyB0aGUgYnJ1c2ggZmVhdHVyZSwgYWxsb3dpbmcgdGhlIHVzZXIgdG8gZHJpbGwgZG93biBhbmQgbGVhcm4gbW9yZSBhYm91dCBzcGVjaWZpYyBwb2ludHMgb2YgaW50ZXJlc3Qgb24gdGhlIGdyYXBoLCBleHBhbmRpbmcgdGhlbSBpbnRvIGEgc2VwZXJhdGUgYmFyIGdyYXBoLgo8YnI+ClRoZSBzbGlkZXJzIGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgbWFyZ2luIG9mIHZpY3RvcnkgbmVjZXNzYXJ5IGZvciBlaXRoZXIgY2FuZGlkYXRlIHRvIGhhdmUgYSAibGFuZHNsaWRlIiB2aWN0b3J5LiBNb3ZlIHRoZSBzbGlkZXJzIGFuZCB1c2UgdGhlIGdlbmVyYXRlIGNyb3NzdGFicyBidXR0b24gdG8gcmVmcmVzaCB0aGUgcGxvdHMuCg==